package cn.good.yan.model.controller;

import cn.good.yan.model.entity.Admin;
import cn.good.yan.model.entity.AdminLogin;
import cn.good.yan.model.entity.Re;
import cn.good.yan.model.service.AdminService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.security.Principal;

/**
 * 登录逻辑
 *
 * @author shengren.yan
 * @create 2024-07-16
 */
@RestController
public class LoginController {

    @Resource
    public AdminService service;


    // 登录逻辑，登录成功后返回 token
    // 前端后续，每次请求，都会把token放到请求头中，后续每次请求都会携带token
    @PostMapping("/login")
    public Re login(@RequestBody AdminLogin adminLogin, HttpServletRequest request) {

        return service.login(
                adminLogin.getUsername(),
                adminLogin.getPassword(),
                adminLogin.getCode(),
                request);
    }


    // 退出登录 - 一般前端去处理，只要前端清空token，就不再访问成功，有拦截器处理
    @PostMapping("/logout")
    public Re logout() {
        return Re.success("注销成功");
    }

    // 获取当前登录用户信息
    // Principal 当前登录的对象，前提是在AdminServiceImpl类中login()中 更新security里的用户信息，才可以获取到
    @GetMapping("/admin/info")
    public Admin getInfo(Principal principal) {
        if (null == principal) {
            return null; // 空就是登录有问题
        }
        String nickname = principal.getName();
        Admin admin = service.getAdminByUserName(nickname);
        admin.setPassword(null); // 一般密码需要设置空，不能前端暴露
        return admin;
    }
    // 可以得到信息：
//    {
//        "id": 1,
//            "username": "admin",
//            "password": null,
//            "enabled": true,
//            "authorities": null,
//            "credentialsNonExpired": true,
//            "accountNonLocked": true,
//            "accountNonExpired": true
//    }

}
